package com.iaz.tech.tools.tasks.invoker;

import com.iaz.tech.tools.tasks.ability.IScheduleAble;
import com.iaz.tech.tools.tasks.ability.ITaskItemAble;

import lombok.Data;

import java.util.ArrayList;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


/**
 * @author Zhao Limin
 * @version 2022.08.01
 * 
 * 用于多任务，多线程的调度和执行
 * 1）引入BaseItem
 * 2) 引入计划，用于定义任务的执行
 * 
 * 
 */
@Data
public class TasksTools {
     /**
     * 日志
     */
	private final static Logger logger = (Logger) LoggerFactory.getLogger(TasksTools.class);
    /**
     * 队列, 用于在多任务中调用任务项目
     * 等待队列
     */
    private List<IScheduleAble> tasksQueue = new ArrayList<>();
    /**
     * 正在等待的队列
     * 调用等待
     */
    private List<IScheduleAble> tasksForWattingQueue = new ArrayList<>();
    /**
     * 执行时间过长， 将任务转移到
     * 队列中
     */
    private List<IScheduleAble> warningQueue = new ArrayList<>();
    /**
     * 等待队列, 运行时间过长，则移动到DeathQueue.
     */
    private List<IScheduleAble> deathQueue = new ArrayList<>();

    /**
     * 添加任务
     * @param _task
     */
    public void addTask(IScheduleAble _task) {
        try {
            if( _task == null ) return;
            this.tasksQueue.add(_task);
        } catch(Exception e) {
            logger.error("添加任务失败", e);
        }
    }

    public void addTask(ITaskItemAble _item) {
        try {
            if( _item == null ) return;

            
            //this.tasksQueue.add(_item);
        } catch(Exception e) {
            logger.error("添加任务失败", e);
        }
    }
    /**
     * 弹出任务
     * @return
     */
    public IScheduleAble popup() {
        IScheduleAble Result = null;
        try {

            if( this.tasksQueue == null ) {
                return Result;
            }
            if( this.tasksQueue.size() == 0 ) {
                return Result;
            }
            Result = this.tasksQueue.remove(0);
            return Result;
        } catch(Exception e) {
            logger.error("弹出任务失败", e);
        }
        return Result;
    }
    
    /**
     * 
     * @param _task
     */
    public void addTaskForWatting(IScheduleAble _task) {
        try {
            if( _task == null ) return;
            if (this.tasksForWattingQueue == null ) {
                this.tasksForWattingQueue = new ArrayList<>();
            }
            this.tasksForWattingQueue.add(_task);
        } catch(Exception e) {
            logger.error("添加任务失败", e);
        }
    }

    /**
     * 添加任务到死亡队列
     * @param _task
     */
    public void addTaskForDeath(IScheduleAble _task) {
        try {
            if( _task == null ) return;
            if (this.deathQueue == null ) {
                this.deathQueue = new ArrayList<>();
            }
            this.deathQueue.add(_task);
        } catch(Exception e) {
            logger.error("添加任务失败", e);
        }
    }
    
    /**
     * 任务队列大小
     * @return
     */
    public long sizeOfTasksQueue() {
        if( this.tasksQueue == null ) {
            return 0;
        }       
        return (long)this.tasksQueue.size();
    }

    /**
     * 任务队列大小
     * @return
     */
    public long sizeOfTasksForWattingQueue() {
        if( this.tasksForWattingQueue == null ) {
            return 0;
        }
        return this.tasksForWattingQueue.size();
    }

    public long sizeOfDeathQueue() {
        if( this.deathQueue == null ) {
            return 0;
        }
        return this.deathQueue.size();
    }

    public long sizeOfWarningQueue() {
        if( this.warningQueue == null ) {
            return 0;
        }
        return this.warningQueue.size();
    }
    

}